/*!
 * \file WtBtDtReaderAD.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader高级回测数据读取器头文件
 * 
 * \details 该文件定义了WtBtDtReaderAD类，提供高级回测数据读取功能，包括：
 *          - LMDB数据库集成：使用Lightning Memory-Mapped Database进行高性能数据读取
 *          - 多周期K线数据读取：支持分钟级(m1/m5)和日线级(d1)数据的回测读取
 *          - Tick数据读取：支持高频Tick数据的快速检索
 *          - 优化的数据组织：按交易所和合约分别组织数据库
 *          - 高效内存映射：通过LMDB实现零拷贝数据访问
 *          
 *          与标准WtBtDtReader相比，WtBtDtReaderAD提供：
 *          - 更高的数据读取性能
 *          - 更好的内存使用效率
 *          - 更快的随机访问速度
 *          - 更大的数据容量支持
 */

#pragma once
#include <string>

#include "../Includes/FasterDefs.h"
#include "../Includes/IBtDtReader.h"

#include "../WTSUtils/WtLMDB.hpp"

NS_WTP_BEGIN

/*!
 * \class WtBtDtReaderAD
 * \brief WonderTrader高级回测数据读取器
 * 
 * \details 该类实现了IBtDtReader接口，提供基于LMDB的高性能回测数据读取功能。
 *          采用分层数据库设计：
 *          - K线数据：按交易所和周期分库存储 (如 ./m1/CFFEX)
 *          - Tick数据：按合约分库存储 (如 ./ticks/CFFEX/IF2101)
 *          
 *          支持的数据类型：
 *          - 1分钟、5分钟、日线K线数据
 *          - 高频Tick数据
 *          
 *          性能特点：
 *          - 基于LMDB的零拷贝读取
 *          - 内存映射文件访问
 *          - 高效的数据库索引
 * 
 * \note 该类专门用于回测场景，提供历史数据的快速访问
 * \see IBtDtReader, WtLMDB
 */
class WtBtDtReaderAD : public IBtDtReader
{
public:
	/*!
	 * \brief 构造函数
	 */
	WtBtDtReaderAD();
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~WtBtDtReaderAD();	

//////////////////////////////////////////////////////////////////////////
//IBtDtReader接口实现
public:
	/*!
	 * \brief 初始化回测数据读取器
	 * \param cfg 配置参数
	 * \param sink 回调接口
	 */
	virtual void init(WTSVariant* cfg, IBtDtReaderSink* sink);

	/*!
	 * \brief 读取原始K线数据
	 * \param exchg 交易所代码
	 * \param code 合约代码
	 * \param period K线周期
	 * \param buffer 输出缓冲区
	 * \return 读取是否成功
	 */
	virtual bool read_raw_bars(const char* exchg, const char* code, WTSKlinePeriod period, std::string& buffer) override;
	
	/*!
	 * \brief 读取原始Tick数据
	 * \param exchg 交易所代码
	 * \param code 合约代码
	 * \param uDate 日期（YYYYMMDD格式）
	 * \param buffer 输出缓冲区
	 * \return 读取是否成功
	 */
	virtual bool read_raw_ticks(const char* exchg, const char* code, uint32_t uDate, std::string& buffer) override;

private:
	std::string		_base_dir;		/*!< 数据库根目录 */

private:
	//////////////////////////////////////////////////////////////////////////
	/*!
	 * \brief LMDB数据库定义和组织结构
	 * 
	 * \details 数据库组织方式：
	 *          - K线数据：按交易所每个周期(m1/m5/d1)分别建立一个数据库，路径如：./m1/CFFEX
	 *          - Tick数据：每个合约一个数据库，路径如：./ticks/CFFEX/IF2101
	 */
	typedef std::shared_ptr<WtLMDB> WtLMDBPtr;		/*!< LMDB数据库智能指针类型 */
	typedef faster_hashmap<std::string, WtLMDBPtr> WtLMDBMap;	/*!< LMDB数据库映射表类型 */

	WtLMDBMap	_exchg_m1_dbs;		/*!< 1分钟K线数据库映射表，key为交易所代码 */
	WtLMDBMap	_exchg_m5_dbs;		/*!< 5分钟K线数据库映射表，key为交易所代码 */
	WtLMDBMap	_exchg_d1_dbs;		/*!< 日线K线数据库映射表，key为交易所代码 */

	WtLMDBMap	_tick_dbs;			/*!< Tick数据库映射表，key为"exchg.code"格式，如"BINANCE.BTCUSDT" */

	/*!
	 * \brief 获取K线数据库实例
	 * \param exchg 交易所代码
	 * \param period K线周期
	 * \return LMDB数据库智能指针
	 */
	WtLMDBPtr	get_k_db(const char* exchg, WTSKlinePeriod period);

	/*!
	 * \brief 获取Tick数据库实例
	 * \param exchg 交易所代码
	 * \param code 合约代码
	 * \return LMDB数据库智能指针
	 */
	WtLMDBPtr	get_t_db(const char* exchg, const char* code);
};

NS_WTP_END